/*********************************************************************************/
/*																																							 */
/*																OBECNE																				 */
/*																																							 */
/*********************************************************************************/

function PhpSerialize (mixed_value)
{ 
    var _getType = function (inp) {
        var type = typeof inp, match;
        var key;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            match = cons.match(/(\w+)\(/);
            if (match) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function":
            val = ""; 
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            var count = 0;
            var vals = "";
            var okey;
            var key;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
                vals += this.PhpSerialize(okey) +
                        this.PhpSerialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
        case "undefined": // Fall-through
        default: // if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
            val = "N";
            break;
    }
    if (type != "object" && type != "array") {
        val += ";";
    }
    return val;
}

function PhpUnserialize (data) {
   var error = function (type, msg, filename, line){throw new this.window[type](msg, filename, line);};
    var read_until = function (data, offset, stopchr){
        var buf = [];
        var chr = data.slice(offset, offset + 1);
        var i = 2;
        while (chr != stopchr) {
            if ((i+offset) > data.length) {
                error('Error', 'Invalid');
            }
            buf.push(chr);
            chr = data.slice(offset + (i - 1),offset + i);
            i += 1;
        }
        return [buf.length, buf.join('')];
    };
    var read_chrs = function (data, offset, length){
        var buf;
 
        buf = [];
        for (var i = 0;i < length;i++){
            var chr = data.slice(offset + (i - 1),offset + i);
            buf.push(chr);
        }

        return [buf.length, buf.join('')];
    };
    var _unserialize = function (data, offset){
        var readdata;
        var readData;
        var chrs = 0;
        var ccount;
        var stringlength;
        var keyandchrs;
        var keys;
 
        if (!offset) {offset = 0;}
        var dtype = (data.slice(offset, offset + 1)).toLowerCase();
 
        var dataoffset = offset + 2;
        var typeconvert = new Function('x', 'return x');
 
        switch (dtype){
            case 'i':
                typeconvert = function (x) {return parseInt(x, 10);};
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case 'b':
                typeconvert = function (x) {return parseInt(x, 10) !== 0;};
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case 'd':
                typeconvert = function (x) {return parseFloat(x);};
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case 'n':
                readdata = null;
            break;
            case 's':
                ccount = read_until(data, dataoffset, ':');
                chrs = ccount[0];
                stringlength = ccount[1];
                dataoffset += chrs + 2;
 
                readData = read_chrs(data, dataoffset+1, parseInt(stringlength, 10));
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 2;
                if (chrs != parseInt(stringlength, 10) && chrs != readdata.length){
                    error('SyntaxError', 'String length mismatch');
                }
            break;
            case 'a':
                readdata = new Array;
 
                keyandchrs = read_until(data, dataoffset, ':');
                chrs = keyandchrs[0];
                keys = keyandchrs[1];
                dataoffset += chrs + 2;
 
                for (var i = 0; i < parseInt(keys, 10); i++){
                    var kprops = _unserialize(data, dataoffset);
                    var kchrs = kprops[1];
                    var key = kprops[2];
                    dataoffset += kchrs;
 
                    var vprops = _unserialize(data, dataoffset);
                    var vchrs = vprops[1];
                    var value = vprops[2];
                    dataoffset += vchrs;
                    readdata[key] = value;
                }
 
                dataoffset += 1;
            break;
            default:
                error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
            break;
            
        }
        return [dtype, dataoffset - offset, typeconvert(readdata)];
    };
    
    return Utf8.decodeArray(_unserialize(Utf8.encode((data+'').replace(/~`~/gi,'"'), 0))[2]);
}

/*********************************************************************************/
/*																																							 */
/*																DIRECT AJAX																		 */
/*																																							 */
/*********************************************************************************/

var mutex=0;
var preloaderBar="";
var UserCallBackFunction;

function odstranPolozkuPole(originalArray, itemToRemove)
{
	var j = 0;
	while (j < originalArray.length)
		if (originalArray[j] == itemToRemove)
			originalArray.splice(j, 1);
		else
			j++;
	return originalArray;
}

/**
/*	@param	string[](0 - cesta stranky, 1 - prazdna pozice, 2 - sbirany formular, 3..x - predavane parametry) 
/*	@return string
/*	@desc oslovi danou stranku ktere post parametry hodnoty z daneho formulare a dodatecne hodnoty.
/***/
function DirectAjaxCoreCallBack(activex,cil,semafor,prictiKCily)
{
  if(activex.readyState == 1 && preloaderBar!="")
      document.getElementById(cil).innerHTML = preloaderBar;
  if(activex.readyState == 4)
  {
    if(cil.length>0 && mutex==semafor && activex.status == 200)
      if(prictiKCily)
        document.getElementById(cil).innerHTML += activex.responseText;
    else
        document.getElementById(cil).innerHTML = activex.responseText;
    try { UserCallBackFunction(); } catch(e) {}
  }
}

function DirectAjaxCore()
{
  var prictiKCily=false;
	var parametry = [];
	var asynchronost = arguments[0][0];
	var url = arguments[0][1];
	var cil = arguments[0][2];
	var formular = arguments[0][3]

	if(formular.length!=0)
	{
		var elementy=document.getElementById(formular).getElementsByTagName('input');
 		for(var i=0;i<elementy.length;i++)
			if((((elementy[i].type=='checkbox' || elementy[i].type=='radio') && elementy[i].checked==true) || (elementy[i].type!='checkbox' && elementy[i].type!='radio')) && elementy[i].name.length>0)
        if(Number(elementy[i].name.indexOf('[]'))>0)
        {
          var tmp=elementy[i].name.substr(0,Number(elementy[i].name.indexOf('[]')));
          if(typeof(parametry[tmp]) == 'undefined')
            parametry[tmp]=[];
          parametry[tmp].push(elementy[i].value);
        }
        else
          parametry[elementy[i].name]=elementy[i].value;

		elementy=document.getElementById(formular).getElementsByTagName('textarea');
 		for(var i=0;i<elementy.length;i++)
			if(elementy[i].name.length>0)
				parametry[elementy[i].name]=elementy[i].value;

		elementy=document.getElementById(formular).getElementsByTagName('select');
 		for(var i=0;i<elementy.length;i++)
			if(elementy[i].name.length>0)
				parametry[elementy[i].name]=elementy[i].value;
	}

	for(var i=3; i<arguments[0].length; i++)
	{
    if(arguments[0][i]=='prictiKCily=true')
      prictiKCily=true;
    
		try	{(arguments[0][i].slice(0,1)).toLowerCase();var typ='s'} catch(e) {var typ='n';}

		if(typ=='s')
		{
			if(arguments[0][i].indexOf('=')==-1)
				parametry.push(arguments[0][i]);
			else
				parametry[arguments[0][i].substr(0,arguments[0][i].indexOf('=')).trim()] = arguments[0][i].substr(arguments[0][i].indexOf('=')+1).trim();
		}
		else
			parametry.push(arguments[0][i]);
	}
	var parametr = encodeURI("do="+PhpSerialize(parametry));

  var inMutex=Math.random()
  mutex=inMutex;

  // IE/zbytek sveta
  if (window.ActiveXObject)
  {
  	if(!(httpRequest = new ActiveXObject("Microsoft.XMLHTTP")))
      return false;
		httpRequest.onreadystatechange = function() {DirectAjaxCoreCallBack(httpRequest,cil,inMutex,prictiKCily);}
  }
  else
  {
    if(!(httpRequest = new XMLHttpRequest()))
      return false;
		httpRequest.onreadystatechange = function() {DirectAjaxCoreCallBack(this,cil,inMutex,prictiKCily);}
  }  
//  httpRequest.ontimeout = function() { DirectAjaxCoreCallBack(this,cil,inMutex); }
//  httpRequest.ontimeout=15000;


  httpRequest.open("POST", url, asynchronost);
	httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	httpRequest.setRequestHeader("Content-length", parametr.length);
	httpRequest.setRequestHeader("Connection", "close");
	httpRequest.send(parametr);

	if(asynchronost)
	  return true;
	else
		return [httpRequest.readyState,httpRequest.status,httpRequest.responseText];
}

/**
* bool DirectAjax(adresaDireckCall, cilovyDiv, zdrojovyFormular [,'idetifier=X' [,function(){UserCallBack()}] [,prictiKCily=true] [,'param=X']])
*/
function DirectAjax()
{
	var pole = [true];

	preloaderBar="";
	for(var i=0; i<arguments.length; i++)
    if (typeof(arguments[i]) == 'function')
      UserCallBackFunction=arguments[i];
    else
    {
      if(i>2 && arguments[i].substr(0,13)=="js_preloader=")
        preloaderBar=arguments[i].substr(13);
      else
          pole.push(arguments[i]);
    }
    
  return DirectAjaxCore(pole);
}

/**
* string DirectAjax(adresaDireckCall, zdrojovyFormular [,'idetifier=X' [,'param=X']])
*/
function DirectAjaxData()
{
	var da_preloader=document.createElement('div');
	da_preloader.className='DirectAjaxDataPreloader';
    document.body.appendChild(da_preloader);
	  
	var pole = [false];
	pole.push(arguments[0]);
	pole.push('');

	preloaderBar="";
	for(var i=1; i<arguments.length; i++)
		if(arguments[i].substr(0,13)=="js_preloader=")
			preloaderBar=arguments[i].substr(13);
		else
			pole.push(arguments[i]);
														
    var vysledek=DirectAjaxCore(pole);

	document.body.removeChild(da_preloader);
	return vysledek[2].trim();
}